Abstract Según la OMS, el cáncer de mama es una enfermedad que afectó a aproximadamente 2.3 millones de mujeres en 2020, siendo una de las principales causas de mortalidad en mujeres en todo el mundo (“Cáncer de Mama” n.d.). Sin embargo, se indica que una de las principales formas de combate a esta enfermedad está en el diagnóstico temprano. Teniendo esto en cuenta, ¿cuales son los parámetros de los signos vitales de una persona más relevantes para poder determinar si está afectada por el cáncer de mama?. A continuación se analizarán los datos de 116 pacientes, de las cuales 64 poseen cáncer de mama.
Los datos que usaremos a continuación corresponden a 116 pacientes mujeres, de los cuales 64 han sido diagnosticados con cáncer de mama. Las variables de estos datos corresponden a:
Dado que los datos presentan distintas escalas, será necesario normalizar los datos. Para ello se utilizará la siguiente función.
normalize_min_max <- function(x) {
return((x - min(x)) / (max(x) - min(x)))
}
Y posteriormente crearemos un nuevo DataFrame con los datos ya normalizados en una escala de 0 a 1.
columnas_a_normalizar = c(
"Age", "BMI", "Glucose", "Insulin", "HOMA", "Leptin", "Adiponectin", "Resistin", "MCP.1",
"Classification")
data_normalizada = data
data_normalizada[columnas_a_normalizar] = lapply(data_normalizada[columnas_a_normalizar], normalize_min_max)
Ahora tenemos una data normalizada como la siguiente.
head(data_normalizada, n = 3)
Con los datos ya normalizados, será necesario generar una matriz de covarianza para averiguar qué tan correlacionados se encuentran los datos. Para esto se aplicará el médoto de correlación de Pearson.
cov_matrix = cor(data_normalizada, method="pearson")
Para mejorar la visualización de estos datos, usaremos un gráfico de mapa de calor (heatmap).
#Segun los datos calculados por método Pearson
corrplot(cov_matrix, method = 'number', col = viridis::viridis(200), bg = "white", tl.cex = 0.8, tl.col = "black", tl.srt = 45, addCoef.col = "black", is.corr = TRUE)
# Agregar un título al final del mapa de calor
mtext("Matriz de correlación - Pearson", side = 2, line = 1, cex = 1.5)
Si nos enfocamos en la clasificación del paciente, podemos observar según los resultados que existe cierta correlación con sus parámetros de Glucosa, Insulina, Indice de resistencia a la insulina (HOMA), Resistina y MCP-1, también podemos observar que existe una leve correlación inversa con el índice de masa corporal, la edad y la adiponectina, y finalmente no existe relación alguna con la leptina.
A continuación calcularemos los autovectores de los datos normalizados.
eigen_result = eigen(cov_matrix)
# Los autovectores se encuentran en la matriz "vectors" del resultado
autovectores = eigen_result$vectors
eigen_result$values
## [1] 3.16962099 1.62378422 1.24426008 1.11420200 0.84636705 0.70534280
## [7] 0.57330323 0.40139481 0.29261122 0.02911359
Ahora, revisemos cuales son los componentes principales de los datos.
#son 10 columnas, por lo que el cálculo lo realizamos sobre las 9 primeras, excluyendo
#la columna Classification
data_normalizada.pca = prcomp(data_normalizada[, 1:9], center=TRUE, scale. = TRUE)
summary(data_normalizada.pca)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 1.7489 1.2338 1.0805 1.0515 0.85002 0.81073 0.66449
## Proportion of Variance 0.3398 0.1691 0.1297 0.1229 0.08028 0.07303 0.04906
## Cumulative Proportion 0.3398 0.5090 0.6387 0.7615 0.84184 0.91487 0.96393
## PC8 PC9
## Standard deviation 0.54095 0.17894
## Proportion of Variance 0.03251 0.00356
## Cumulative Proportion 0.99644 1.00000
Como podemos observar, los primeros 7 componentes explican la mayor parte de la variabilidad presente en el conjunto de datos. Podemos ver la transformación lineal a continuación:
head(data_normalizada.pca$x, n=3)
## PC1 PC2 PC3 PC4 PC5 PC6
## [1,] -1.984176 -0.1250696 0.3613016 -0.2729356 -0.4905239 -0.34318169
## [2,] -1.323090 -0.2468592 1.3309658 1.8862091 -0.1746008 0.08561203
## [3,] -1.211986 -0.9881059 0.3614967 0.9097251 1.3090830 1.38165278
## PC7 PC8 PC9
## [1,] 0.27747423 -0.1990212 -0.24894048
## [2,] 0.08398515 -0.4389960 0.01880508
## [3,] 0.54471905 0.1561165 0.04414919
Agregando la columna Classification
pca_data <- data.frame(data_normalizada.pca$x, Classification=data_normalizada$Classification)
head(pca_data, n=3)
A continuación trazaremos los componentes principales:
Podemos usar plot_ly para mostrar un gráfico 3D de los componentes principales:
# Tenemos siete componentes principales PC1, PC2, PC3, PC4, PC5, PC6 y PC7
# Creamos un dataframe con los siete componentes principales y la columna "Classification" categórica
pca_data_3d <- data.frame(PC1 = pca_data$PC1, PC2 = pca_data$PC2, PC3 = pca_data$PC3,
PC4 = pca_data$PC4, PC5 = pca_data$PC5, PC6 = pca_data$PC6,
PC7 = pca_data$PC7, Classification = pca_data$Classification)
# Graficar en 3D usando plot_ly
plot_ly(data = pca_data_3d, x = ~PC1, y = ~PC2, z = ~PC3, color = ~Classification,
type = "scatter3d", mode = "markers", marker = list(size = 3))